gccfandomcom_ja-20200214-history
Make node stat
このページを編集する際は，編集に関する方針に従ってください． 概要 *gcc-4.1.0/gcc/tree.cにて定義 * enum tree_code に対応する型のノードを作り，ポインタを返す． tree_code に対応する型のサイズを tree_code_size で取得し，メモリを確保し，0 で初期化し，struct tree_node の code メンバを引数の tree_code で初期化する程度の処理を行うのみ． 376 /* Return a newly allocated node of code CODE. For decl and type 377 nodes, some other fields are initialized. The rest of the node is 378 initialized to zero. This function cannot be used for PHI_NODE or 379 TREE_VEC nodes, which is enforced by asserts in tree_code_size. 380 381 Achoo! I got a code in the node. */ 引数 * ** 実装 383 tree 384 make_node_stat (enum tree_code code MEM_STAT_DECL) 385 { 386 tree t; 387 enum tree_code_class type = TREE_CODE_CLASS (code); 388 size_t length = tree_code_size (code); 389 #ifdef GATHER_STATISTICS 390 tree_node_kind kind; 391 392 switch (type) 393 { 394 case tcc_declaration: /* A decl node */ 395 kind = d_kind; 396 break; 397 398 case tcc_type: /* a type node */ 399 kind = t_kind; 400 break; 401 402 case tcc_statement: /* an expression with side effects */ 403 kind = s_kind; 404 break; 405 406 case tcc_reference: /* a reference */ 407 kind = r_kind; 408 break; 409 410 case tcc_expression: /* an expression */ 411 case tcc_comparison: /* a comparison expression */ 412 case tcc_unary: /* a unary arithmetic expression */ 413 case tcc_binary: /* a binary arithmetic expression */ 414 kind = e_kind; 415 break; 416 417 case tcc_constant: /* a constant */ 418 kind = c_kind; 419 break; 420 421 case tcc_exceptional: /* something random, like an identifier. */ 422 switch (code) 423 { 424 case IDENTIFIER_NODE: 425 kind = id_kind; 426 break; 427 428 case TREE_VEC: 429 kind = vec_kind; 430 break; 431 432 case TREE_BINFO: 433 kind = binfo_kind; 434 break; 435 436 case PHI_NODE: 437 kind = phi_kind; 438 break; 439 440 case SSA_NAME: 441 kind = ssa_name_kind; 442 break; 443 444 case BLOCK: 445 kind = b_kind; 446 break; 447 448 case CONSTRUCTOR: 449 kind = constr_kind; 450 break; 451 452 default: 453 kind = x_kind; 454 break; 455 } 456 break; 457 458 default: 459 gcc_unreachable (); 460 } 461 462 tree_node_countskind++; 463 tree_node_sizeskind += length; 464 #endif 465 466 if (code IDENTIFIER_NODE) 467 t = ggc_alloc_zone_pass_stat (length, &tree_id_zone); 468 else 469 t = ggc_alloc_zone_pass_stat (length, &tree_zone); 470 471 memset (t, 0, length); 472 473 TREE_SET_CODE (t, code); 474 475 switch (type) 476 { 477 case tcc_statement: 478 TREE_SIDE_EFFECTS (t) = 1; 479 break; 480 481 case tcc_declaration: 482 if (code != FUNCTION_DECL) 483 DECL_ALIGN (t) = 1; 484 DECL_USER_ALIGN (t) = 0; 485 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 486 DECL_IN_SYSTEM_HEADER (t) = in_system_header; 487 /* We have not yet computed the alias set for this declaration. */ 488 DECL_POINTER_ALIAS_SET (t) = -1; 489 DECL_SOURCE_LOCATION (t) = input_location; 490 DECL_UID (t) = next_decl_uid++; 491 492 break; 493 494 case tcc_type: 495 TYPE_UID (t) = next_type_uid++; 496 TYPE_ALIGN (t) = BITS_PER_UNIT; 497 TYPE_USER_ALIGN (t) = 0; 498 TYPE_MAIN_VARIANT (t) = t; 499 500 /* Default to no attributes for type, but let target change that. */ 501 TYPE_ATTRIBUTES (t) = NULL_TREE; 502 targetm.set_default_type_attributes (t); 503 504 /* We have not yet computed the alias set for this type. */ 505 TYPE_ALIAS_SET (t) = -1; 506 break; 507 508 case tcc_constant: 509 TREE_CONSTANT (t) = 1; 510 TREE_INVARIANT (t) = 1; 511 break; 512 513 case tcc_expression: 514 switch (code) 515 { 516 case INIT_EXPR: 517 case MODIFY_EXPR: 518 case VA_ARG_EXPR: 519 case PREDECREMENT_EXPR: 520 case PREINCREMENT_EXPR: 521 case POSTDECREMENT_EXPR: 522 case POSTINCREMENT_EXPR: 523 /* All of these have side-effects, no matter what their 524 operands are. */ 525 TREE_SIDE_EFFECTS (t) = 1; 526 break; 527 528 default: 529 break; 530 } 531 break; 532 533 default: 534 /* Other classes need no special treatment. */ 535 break; 536 } 537 538 return t; 539 }